package com.wry.refflec.service;



import com.wry.common.vo.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author     ：wry
 * @date       ：Created in 2021/6/22 15:16
 * @description：反射测试demo
 * @version     :1.0
 * @modified By：
 */
public class reflectService {

    public static void main(String[] args) throws Exception {
        //获取类对象的三种方式
        //通过名称获取类对象
        Class<?> userClass = Class.forName("com.wry.mystudylog.vo.User");
        System.out.println(userClass);
        //通过对象获取类对象
        User userTemp = new User(1, "王如源");
        Class<? extends User> userClass1 = userTemp.getClass();
        System.out.println(userClass1);
        //通过类的隐藏静态方法获取类对象
        Class<User> userClass2 = User.class;
        System.out.println(userClass2);

        //通过类对象调用方法，属性,获取注解
        //通过类对象获取实例，两种方式
        Constructor<?> declaredConstructor = userClass.getDeclaredConstructor();
        User user = (User) declaredConstructor.newInstance();

        User user1 = userClass1.newInstance();
        //通过类对象调用方法,两种方式
        Method setName = userClass.getMethod("setName", String.class);
        setName.invoke(user, "王如源");

        Method getName = userClass.getMethod("getName");
        Object invoke = getName.invoke(user);
        System.out.println("获取名称：" + invoke.toString());

        Method setName1 = userClass1.getDeclaredMethod("setName", String.class);
        setName1.invoke(user1, "王如源1");
        System.out.println("获取名称：" + user1.getName());

        //通过类对象获取属性
        Field name = userClass.getDeclaredField("name");
        //设置属性可访问，否则private参数不允许访问
        name.setAccessible(true);
        Object o = name.get(user);
        System.out.println("通过属性获取出值为：" + o.toString());
        name.set(user,"王如源2");
        System.out.println("设置完属性后的name值为：" + user.getName());
    }

}
